package lambda06;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Predicate接口中的默认方法
 *     //相当于多个条件进行&&连接
 *     //可以完成链式编程
 *     //p1.and(p2).test(product)
 *     default Predicate<T> and(Predicate<? super T> other) {
 *         Objects.requireNonNull(other);
 *         return (t) -> this.test(t) && other.test(t);//p1.test(t) && p2.test(t)
 *     }
 *     default Predicate<T> or(Predicate<? super T> other) {
 *         Objects.requireNonNull(other);
 *         return (t) -> test(t) || other.test(t);
 *     }
 *
 *     default Predicate<T> negate() {
 *         return (t) -> !test(t);
 *     }
 *
 *  需求:
 *    1.新建一个Product类,其中包含商品名称和商品的价格
 *    2.新建一个List集合,存储四个商品
 *    完成以下需求:
 *     a.打印集合中价格<3000的商品信息
 *     b.打印集合中商品名称包含联想并且价格>=3000的商品信息
 *        商品名称要包含联想
 *        商品价格>=3000
 *     c.打印集合中商品名称包含华硕或者价格>7000的商品信息
 *     d.打印集合中商品名称不包含联想的商品信息
 */
public class PredicateDemo02 {
	@Test
	public void test01() {
		List<Product> products = Arrays.asList(
				new Product("联想笔记本", 3000),
				new Product("联想手机", 2000),
				new Product("华硕笔记本", 7000),
				new Product("三星冰箱", 10000)
		);

		method01(products,product -> product.getProductPrice()<3000);
	}
	//a.打印集合中价格<3000的商品信息
	public void method01(List<Product> products, Predicate<Product> p) {
         //1.遍历products集合
		for (Product product : products) {
			if (p.test(product)) { //对当前遍历到的product对象执行p对应的Lambda表达式{}中内容
				System.out.println(product);
			}
		}
	}

	@Test
	public void test02() {
		List<Product> products = Arrays.asList(
				new Product("联想笔记本", 3000),
				new Product("联想手机", 2000),
				new Product("华硕笔记本", 7000),
				new Product("三星冰箱", 10000)
		);
		method02(products,
				product -> product.getProductName().contains("联想"),
				product -> product.getProductPrice() >= 3000);
	}
	//b.打印集合中商品名称包含联想并且价格>=3000的商品信息
	public void method02(List<Product> products,Predicate<Product> p1,Predicate<Product> p2) {
		//1.遍历products集合
		for (Product product : products) {
			/*if (p1.test(product) && p2.test(product)) {
				System.out.println(product);
			}*/
			if (p1.and(p2).test(product)) {
				System.out.println(product);
			}
		}
	}


	// c.打印集合中商品名称包含华硕或者价格>7000的商品信息
	@Test
	public void test03() {
		List<Product> products = Arrays.asList(
				new Product("联想笔记本", 3000),
				new Product("联想手机", 2000),
				new Product("华硕笔记本", 7000),
				new Product("三星冰箱", 10000)
		);
		method03(products,
				 product -> product.getProductName().contains("华硕"),
				 product -> product.getProductPrice()>7000);
	}
	public void method03(List<Product> products,Predicate<Product> p1,Predicate<Product> p2) {
		//1.遍历products集合
		for (Product product : products) {
			if (p1.or(p2).test(product)) {//product.getProductName().contains("华硕") || product.getProductPrice()>7000)
				System.out.println(product);
			}
		}
	}




	@Test
	public void test04() {
		List<Product> products = Arrays.asList(
				new Product("联想笔记本", 3000),
				new Product("联想手机", 2000),
				new Product("华硕笔记本", 7000),
				new Product("三星冰箱", 10000)
		);
		method04(products,
				 product -> product.getProductName().contains("联想"));
	}
	//d.打印集合中商品名称不包含联想的商品信息
	public void method04(List<Product> products,Predicate<Product> p1) {
		//1.遍历products集合
		for (Product product : products) {
			if (p1.negate().test(product)) {//!product.getProductName().contains("联想"))
				System.out.println(product);
			}
		}
	}
}
